Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.Net - RISOLTO] Calcolo esponenti RSA, crasha il programma
Forum - C# / VB.NET - [VB.Net - RISOLTO] Calcolo esponenti RSA, crasha il programma

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
itAndy90 (Normal User)
Newbie


Messaggi: 11
Iscritto: 04/07/2009

Segnala al moderatore
Postato alle 22:09
Sabato, 04/07/2009
Questo topic è stato chiuso dal moderatore

Ciao a tutti
avendo portato nella tesina un'analisi dell'algoritmo RSA, volevo affiancargli un software in VB che calcolasse gli esponenti pubblici e privati. Una cosa molto semplice eh, se pensate che sceglie i numeri primi tra soli 10 e per di più molto piccoli...

Il problema si presenta durante il calcolo dell'ultimo esponente: se faccio partire il calcolo degli esponenti con quella parte di codice "attiva", il programma va in crash e non risponde (i test sono fatti con il debug, e cosa strana NON MI SEGNALA PROBLEMI :-|). Se levo la parte relativa all'ultimo esponente, il programma va in run senza presentare problemi, calcolando quindi l'unico esponente che gli viene richiesto. Spero mi possiate dare una mano, perchè ci terrei a portarlo =). Ecco il codice:

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
  3.         Dim m As Double
  4.         If b = 0 Then Return a Else
  5.         Do
  6.             m = a Mod b
  7.             a = b
  8.             b = m
  9.         Loop Until b = 0
  10.         Return a
  11.     End Function
  12.  
  13.     Private Sub calcola_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calcola.Click
  14.         Dim ncas As Single
  15.         Dim p, q As Integer
  16.         Dim vtprimi(9), n, pvt, z As Integer
  17.         Dim pub As Single
  18.  
  19.         vtprimi(0) = 29
  20.         vtprimi(1) = 31
  21.         vtprimi(2) = 37
  22.         vtprimi(3) = 41
  23.         vtprimi(4) = 43
  24.         vtprimi(5) = 47
  25.         vtprimi(6) = 53
  26.         vtprimi(7) = 59
  27.         vtprimi(8) = 61
  28.         vtprimi(9) = 67
  29.  
  30.         Randomize()
  31.         ncas = Rnd()
  32.         Select Case ncas
  33.             Case 0 To 0.099999999
  34.                 p = vtprimi(0)
  35.             Case 0.1 To 0.199999999
  36.                 p = vtprimi(1)
  37.             Case 0.2 To 0.299999999
  38.                 p = vtprimi(2)
  39.             Case 0.3 To 0.399999999
  40.                 p = vtprimi(3)
  41.             Case 0.4 To 0.499999999
  42.                 p = vtprimi(4)
  43.             Case 0.5 To 0.599999999
  44.                 p = vtprimi(5)
  45.             Case 0.6 To 0.699999999
  46.                 p = vtprimi(6)
  47.             Case 0.7 To 0.799999999
  48.                 p = vtprimi(7)
  49.             Case 0.8 To 0.899999999
  50.                 p = vtprimi(8)
  51.             Case 0.9 To 1
  52.                 p = vtprimi(9)
  53.         End Select
  54.         form_p.Text = p
  55.  
  56.         ncas = Rnd()
  57.         Select Case ncas
  58.             Case 0 To 0.099999999
  59.                 q = vtprimi(0)
  60.             Case 0.1 To 0.199999999
  61.                 q = vtprimi(1)
  62.             Case 0.2 To 0.299999999
  63.                 q = vtprimi(2)
  64.             Case 0.3 To 0.399999999
  65.                 q = vtprimi(3)
  66.             Case 0.4 To 0.499999999
  67.                 q = vtprimi(4)
  68.             Case 0.5 To 0.599999999
  69.                 q = vtprimi(5)
  70.             Case 0.6 To 0.699999999
  71.                 q = vtprimi(6)
  72.             Case 0.7 To 0.799999999
  73.                 q = vtprimi(7)
  74.             Case 0.8 To 0.899999999
  75.                 q = vtprimi(8)
  76.             Case 0.9 To 1
  77.                 q = vtprimi(9)
  78.         End Select
  79.         form_q.Text = q
  80.         n = p * q
  81.         form_n.Text = n
  82.  
  83.         z = (p - 1) * (q - 1)
  84.         pvt = 2
  85.         Do While (MCD(z, pvt) <> 1)
  86.             pvt = pvt + 1
  87.         Loop
  88.         form_pvtexp.Text = pvt
  89.         pub = 1
  90.         Do While ((pub * pvt) Mod z) <> 1
  91.             pub = pub + 1
  92.         Loop
  93.         form_pubexp.Text = pub
  94.     End Sub
  95. End Class



La funzione MCD serve per il calcolo del massimo comun divisore, utile per vedere se due numeri sono coprimi tra loro. Grazie in anticipo a tutti per le eventuali risposte:k:

Ultima modifica effettuata da itAndy90 il 06/07/2009 alle 16:08
PM
Avatar
Jeremy (Normal User)
Pro


Messaggi: 134
Iscritto: 08/02/2009

Segnala al moderatore
Postato alle 22:48
Sabato, 04/07/2009
Ciao.
Non chiedermi perchè .... ma il problema è che ti sei dimenticato di valorizzare la variabile pvt, pertanto, rimanendo sempre uguale a 0, il ciclo
Codice sorgente - presumibilmente VB.NET

  1. Do While ((pub * pvt) Mod z) <> 1
  2. pub = pub + 1
  3. Loop


risulta infinito (perchè la funzione non restituirà mai un valore diverso da 0) ... mandando in OverFlow la variabile pub.

Facci sapere....
Ciao

PM
Avatar
itAndy90 (Normal User)
Newbie


Messaggi: 11
Iscritto: 04/07/2009

Segnala al moderatore
Postato alle 23:21
Sabato, 04/07/2009
Testo quotato

Postato originariamente da Jeremy:

Ciao.
Non chiedermi perchè .... ma il problema è che ti sei dimenticato di valorizzare la variabile pvt, pertanto, rimanendo sempre uguale a 0, il ciclo
Codice sorgente - presumibilmente VB.NET

  1. Do While ((pub * pvt) Mod z) <> 1
  2. pub = pub + 1
  3. Loop


risulta infinito (perchè la funzione non restituirà mai un valore diverso da 0) ... mandando in OverFlow la variabile pub.

Facci sapere....
Ciao


Grazie Jeremy
in effetti modificando il programma in cerca dell'errore devo aver combinato un bel casino, confondendo le variabili pub e pvt. Ho corretto nel sorgente, ma si presenta un'altro problema: l'esponente pubblico mi risulta identico a quello privato... :d

Tra l'altro, per evitare eventuali problemi di overflow, ho abbassato i valori primi nel vettore... ma ovviamente il problema dei valori pubblici e privati persiste

Ultima modifica effettuata da itAndy90 il 04/07/2009 alle 23:24
PM
Avatar
Jeremy (Normal User)
Pro


Messaggi: 134
Iscritto: 08/02/2009

Segnala al moderatore
Postato alle 8:52
Domenica, 05/07/2009
Ciao.
A dire il vero ... io, di calcolo degli esponenti RSA ..... non ci capisco un emerito ***** :rofl: .....il primo errore l'ho trovato copiando ed incollando il tuo codice in un progetto nuovo e facendone il Debug .... pertanto, se ci mostri il nuovo codice, magari potrei fare la stessa cosa .... stasera quando torno.

Facci sapere...
Ciao:D

PM
Avatar
itAndy90 (Normal User)
Newbie


Messaggi: 11
Iscritto: 04/07/2009

Segnala al moderatore
Postato alle 13:07
Domenica, 05/07/2009
Testo quotato

Postato originariamente da Jeremy:

Ciao.
A dire il vero ... io, di calcolo degli esponenti RSA ..... non ci capisco un emerito ***** :rofl: .....il primo errore l'ho trovato copiando ed incollando il tuo codice in un progetto nuovo e facendone il Debug .... pertanto, se ci mostri il nuovo codice, magari potrei fare la stessa cosa .... stasera quando torno.

Facci sapere...
Ciao:D


Grazie ^___^
Il codice l'ho aggiornato nel primo post con le correzioni opportune. Guarda, pare una cosa difficilissima in realtà le operazioni da fare per calcolare gli esponenti sono poche e sempici:
Testo quotato

Calcolare gli esponenti:
   1. Si prendono due numeri primi, che chiameremo p e q
   2. Si esegue il prodotto n = p * q che chiameremo modulo
   3. Si calcola z = (np1 - 1)(np2 - 1)
   4. Si calcola il numero pvt tale che pub sia primo rispetto a z (non devono avere fattori primi in comune) chiamato esponente pubblico
   5. Si calcola il numero pub tale che (pvt * pub) mod z = 1


(pvt*pub) mod z = 1 sarebbe il resto della divisione tra (pub*pvt) e z che deve essere appunto uguale ad 1. Te lo dico non per nulla, ma perchè io da emerito tortello non capivo cosa significasse xD

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:07
Domenica, 05/07/2009
Codice sorgente - presumibilmente VB.NET

  1. Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
  2.         Dim m As Double
  3.         If b = 0 Then Return a Else
  4.         Do
  5.             m = a Mod b
  6.             a = b
  7.             b = m
  8.         Loop Until b = 0
  9.         Return a
  10.     End Function
  11. '...
  12.         z = (p - 1) * (q - 1)
  13.         pvt = z
  14.         Do While (MCD(z, pvt) <> 1)
  15.             pvt = pvt - 1
  16.         Loop
  17.         form_pvtexp.Text = pvt
  18.         pub = 1
  19.         Do While ((pub * pvt) Mod z) <> 1
  20.             pub = pub + 1
  21.         Loop
  22.         '...


Credo che l'errore sia qui. Infatti, se tu parti da pvt=z, la funzione MCD(z,z) restituisce z, che in effetti è il massimo comune divisore tra i due parametri identifici. Perciò risulta che qualsiasi prodotto di un numero intero per pvt è sempre divisibile per z, quindi l'espressione ((pub*pvt) Mod z) è sempre uguale a 0, e il programma va in loop.

Ultima modifica effettuata da Il Totem il 05/07/2009 alle 14:07
PM
Avatar
itAndy90 (Normal User)
Newbie


Messaggi: 11
Iscritto: 04/07/2009

Segnala al moderatore
Postato alle 20:42
Domenica, 05/07/2009
Testo quotato

Postato originariamente da Il Totem:

Codice sorgente - presumibilmente VB.NET

  1. Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
  2.         Dim m As Double
  3.         If b = 0 Then Return a Else
  4.         Do
  5.             m = a Mod b
  6.             a = b
  7.             b = m
  8.         Loop Until b = 0
  9.         Return a
  10.     End Function
  11. '...
  12.         z = (p - 1) * (q - 1)
  13.         pvt = z
  14.         Do While (MCD(z, pvt) <> 1)
  15.             pvt = pvt - 1
  16.         Loop
  17.         form_pvtexp.Text = pvt
  18.         pub = 1
  19.         Do While ((pub * pvt) Mod z) <> 1
  20.             pub = pub + 1
  21.         Loop
  22.         '...


Credo che l'errore sia qui. Infatti, se tu parti da pvt=z, la funzione MCD(z,z) restituisce z, che in effetti è il massimo comune divisore tra i due parametri identifici. Perciò risulta che qualsiasi prodotto di un numero intero per pvt è sempre divisibile per z, quindi l'espressione ((pub*pvt) Mod z) è sempre uguale a 0, e il programma va in loop.


Cacchio Totem, hai ragione. Sto stress da esami mi sta friggendo il cervello :rofl: Potrei provare partendo da pvt = z - 1... Vi faccio sapere tra poco... L'unico problema è capire se poi effettivamente i valori che mi calcola sono esatti o meno... 8-|

EDIT: Ok, il cervello mi si sta bruciando davvero. Allora, in effetti Totem il discorso che fai è giusto, ma anche quella parte di programma. I due numeri devono essere coprimi e l'esponente privato deve essere più piccolo del modulo. Ho fatto delle prove e la variabile pvt è sempre più piccolo di z (quindi non è uguale)... Il problema sono strasicuro che sia nell'ultimo blocco del programma, perchè la variabile pub parte da 1 ed arriva fino allo stesso valore di pvt... Adesso come adesso il programma non mi va in loop, ma i due esponenti hanno valore sempre identico (e mi sembra impossibile). Può darsi che l'utilizzo di numeri molto piccoli rispetto a quelli raccomandati provochi questo problema?

Ultima modifica effettuata da itAndy90 il 05/07/2009 alle 21:00
PM
Avatar
itAndy90 (Normal User)
Newbie


Messaggi: 11
Iscritto: 04/07/2009

Segnala al moderatore
Postato alle 21:43
Domenica, 05/07/2009
Scusate se posto due volte di fila, ma è per evitare di fare troppo casino in un post solo. Allora, il problema dove dice Totem ci sta... ma non capisco perchè entra nel ciclo una sola volta (l'exp privato è sempre uguale a z - 1...

Per quello che riguarda l'esponente pubblico, credo che dipenda dall'errore precedente. Voi avete qualche soluzione? Perchè io inizio a capirci davvero poco. Tra l'altro, l'exp. pubblico risulta uguale al privato semplicemente perchè è il privato a non essere un numero conforme alle regole dell'algoritmo, di conseguenza l'exp pubblico non può più essere un intero, ma sarà un decimale (risultava uguale perchè pvt = pub era l'unico caso in cui veniva soddisfatta la condizione di uscita del ciclo).

Sarebbe un peccato non presentare sto programmino, mi darebbe una mano a prendere uno schifosissimo 80:yup:

Ultima modifica effettuata da itAndy90 il 05/07/2009 alle 21:46
PM
Avatar
Jeremy (Normal User)
Pro


Messaggi: 134
Iscritto: 08/02/2009

Segnala al moderatore
Postato alle 21:54
Domenica, 05/07/2009
Ciao.
Quello che posso fare io è aiutarti ad individuare le *assurdità* (in senso buono) del codice ... ma la soluzione ... la devi trovare tu....perchè io proprio non saprei.
Per esempio, la funzione MCD così come è scritta....
Codice sorgente - presumibilmente VB.NET

  1. Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
  2.         Dim m As Double
  3.         If b = 0 Then Return a Else
  4.         Do
  5.             m = a Mod b
  6.             a = b
  7.             b = m
  8.         Loop Until b = 0
  9.         Return a
  10.     End Function



ti restituirà sempre e comunque, a prescindere dalle operazioni che fai all'interno della funzione, il valore originale di b (quello che hai passato come parametro) .... e non penso sia quello che vuoi.  giusto??


Facci sapere...
Ciao

PM
Pagine: [ 1 2 ] Precedente | Prossimo